<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge" >
  <link rel="dns-prefetch" href="https://ZhenshengLee.github.io">
  <title>ROSBridgeSuit | 哈骑士的博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="前言
ROS程序与非ROS程序沟通">
<meta property="og:type" content="article">
<meta property="og:title" content="ROSBridgeSuit">
<meta property="og:url" content="https://ZhenshengLee.github.io/2017/01/03/170103-ROSBridgeSuit/index.html">
<meta property="og:site_name" content="哈骑士的博客">
<meta property="og:description" content="前言
ROS程序与非ROS程序沟通">
<meta property="og:updated_time" content="2017-01-03T15:43:02.160Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="ROSBridgeSuit">
<meta name="twitter:description" content="前言
ROS程序与非ROS程序沟通">
  
    <link rel="alternative" href="/atom.xml" title="哈骑士的博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  <link rel="stylesheet" type="text/css" href="/main.68ab53.css">
  <style type="text/css">
  
    #container.show {
      background: linear-gradient(200deg,#a0cfe4,#e8c37e);
    }
  </style>
  

  

</head>

<body>
  <div id="container" q-class="show:isCtnShow">
    <canvas id="anm-canvas" class="anm-canvas"></canvas>
    <div class="left-col" q-class="show:isShow">
      
<div class="overlay" style="background: #4d4d4d"></div>
<div class="intrude-less">
	<header id="header" class="inner">
		<a href="/" class="profilepic">
			<img src="http://7xvunf.com1.z0.glb.clouddn.com/%E5%85%B6%E4%BB%96100.jpg" class="js-avatar">
		</a>
		<hgroup>
		  <h1 class="header-author"><a href="/">黎振胜</a></h1>
		</hgroup>
		
		<p class="header-subtitle">将科技固化为产品——机器人软件开发</p>
		

		<nav class="header-menu">
			<ul>
			
				<li><a href="/">主页</a></li>
	        
				<li><a href="/tags/机器人/">机器人</a></li>
	        
				<li><a href="/tags/嵌入式/">嵌入式</a></li>
	        
				<li><a href="/tags/其他/">其他</a></li>
	        
			</ul>
		</nav>
		<nav class="header-smart-menu">
    		
    			
    			<a q-on="click: openSlider(e, 'innerArchive')" href="javascript:void(0)">所有文章</a>
    			
            
    			
            
    			
    			<a q-on="click: openSlider(e, 'aboutme')" href="javascript:void(0)">关于我</a>
    			
            
		</nav>
		<nav class="header-nav">
			<div class="social">
				
					<a class="github" target="_blank" href="https://github.com/ZhenshengLee" title="github"><i class="icon-github"></i></a>
		        
					<a class="mail" target="_blank" href="mailto://lzs_1993@qq.com" title="mail"><i class="icon-mail"></i></a>
		        
					<a class="linkedin" target="_blank" href="https://cn.linkedin.com/in/zhenshengli" title="linkedin"><i class="icon-linkedin"></i></a>
		        
			</div>
		</nav>
	</header>		
</div>

    </div>
    <div class="mid-col" q-class="show:isShow,hide:isShow|isFalse">
      
<nav id="mobile-nav">
  	<div class="overlay js-overlay" style="background: #4d4d4d"></div>
	<div class="btnctn js-mobile-btnctn">
  		<div class="slider-trigger list" q-on="click: openSlider(e)"><i class="icon icon-sort"></i></div>
	</div>
	<div class="intrude-less">
		<header id="header" class="inner">
			<div class="profilepic">
				<img src="http://7xvunf.com1.z0.glb.clouddn.com/%E5%85%B6%E4%BB%96100.jpg" class="js-avatar">
			</div>
			<hgroup>
			  <h1 class="header-author js-header-author">黎振胜</h1>
			</hgroup>
			
			<p class="header-subtitle"><i class="icon icon-quo-left"></i>将科技固化为产品——机器人软件开发<i class="icon icon-quo-right"></i></p>
			
			
			
				
			
				
			
				
			
				
			
			
			
			<nav class="header-nav">
				<div class="social">
					
						<a class="github" target="_blank" href="https://github.com/ZhenshengLee" title="github"><i class="icon-github"></i></a>
			        
						<a class="mail" target="_blank" href="mailto://lzs_1993@qq.com" title="mail"><i class="icon-mail"></i></a>
			        
						<a class="linkedin" target="_blank" href="https://cn.linkedin.com/in/zhenshengli" title="linkedin"><i class="icon-linkedin"></i></a>
			        
				</div>
			</nav>

			<nav class="header-menu js-header-menu">
				<ul style="width: 70%">
				
				
					<li style="width: 25%"><a href="/">主页</a></li>
		        
					<li style="width: 25%"><a href="/tags/机器人/">机器人</a></li>
		        
					<li style="width: 25%"><a href="/tags/嵌入式/">嵌入式</a></li>
		        
					<li style="width: 25%"><a href="/tags/其他/">其他</a></li>
		        
				</ul>
			</nav>
		</header>				
	</div>
	<div class="mobile-mask" style="display:none" q-show="isShow"></div>
</nav>

      <div id="wrapper" class="body-wrap">
        <div class="menu-l">
          <div class="canvas-wrap">
            <canvas data-colors="#eaeaea" data-sectionHeight="100" data-contentId="js-content" id="myCanvas1" class="anm-canvas"></canvas>
          </div>
          <div id="js-content" class="content-ll">
            <article id="post-170103-ROSBridgeSuit" class="article article-type-post " itemscope itemprop="blogPost">
  <div class="article-inner">
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      ROSBridgeSuit
    </h1>
  

        
        <a href="/2017/01/03/170103-ROSBridgeSuit/" class="archive-article-date">
  	<time datetime="2017-01-03T15:43:02.160Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2017-01-03</time>
</a>
        
      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="&#x524D;&#x8A00;"><a href="#&#x524D;&#x8A00;" class="headerlink" title="&#x524D;&#x8A00;"></a>&#x524D;&#x8A00;</h2><ul>
<li>ROS&#x7A0B;&#x5E8F;&#x4E0E;&#x975E;ROS&#x7A0B;&#x5E8F;&#x6C9F;&#x901A;</li>
</ul>
<a id="more"></a>
<h2 id="&#x76EE;&#x5F55;"><a href="#&#x76EE;&#x5F55;" class="headerlink" title="&#x76EE;&#x5F55;"></a>&#x76EE;&#x5F55;</h2><!-- toc -->
<ul>
<li><a href="#&#x53C2;&#x8003;">&#x53C2;&#x8003;</a></li>
<li><a href="#&#x5B66;&#x4E60;&#x8BB0;&#x5F55;">&#x5B66;&#x4E60;&#x8BB0;&#x5F55;</a><ul>
<li><a href="#rosbridge_suit">rosbridge_suit</a></li>
<li><a href="#websocket-json-api&#x662F;&#x5565;">WebSocket Json API&#x662F;&#x5565;</a></li>
<li><a href="#rosbridge20&#x534F;&#x8BAE;&#x89C4;&#x7EA6;">rosbridge2.0&#x534F;&#x8BAE;&#x89C4;&#x7EA6;</a><ul>
<li><a href="#&#x4F20;&#x8F93;&#x5C42;">&#x4F20;&#x8F93;&#x5C42;</a></li>
<li><a href="#&#x534F;&#x8BAE;&#x89C4;&#x7EA6;&#x4E3B;&#x8981;&#x5206;&#x7C7B;">&#x534F;&#x8BAE;&#x89C4;&#x7EA6;&#x4E3B;&#x8981;&#x5206;&#x7C7B;</a></li>
</ul>
</li>
<li><a href="#ros&#x6D88;&#x606F;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;">ROS&#x6D88;&#x606F;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;</a><ul>
<li><a href="#341-advertise-_advertise_">3.4.1 Advertise ( <em>advertise</em> )</a></li>
<li><a href="#343-publish-_publish_">3.4.3 Publish ( <em>publish</em> )</a></li>
<li><a href="#344-subscribe">3.4.4 Subscribe</a></li>
<li><a href="#346-call-service">3.4.6 Call Service</a></li>
<li><a href="#347-advertise-service">3.4.7 Advertise Service</a></li>
<li><a href="#348-unadvertise-service">3.4.8 Unadvertise Service</a></li>
<li><a href="#349-service-response">3.4.9 Service Response</a></li>
</ul>
</li>
<li><a href="#rosbridge-server-implementation">rosbridge server implementation</a></li>
<li><a href="#labview-json-tcp">LabVIEW JSON TCP</a></li>
<li><a href="#rosbridge-suit&#x4F7F;&#x7528;">rosbridge-suit&#x4F7F;&#x7528;</a><ul>
<li><a href="#&#x5B89;&#x88C5;">&#x5B89;&#x88C5;</a></li>
<li><a href="#&#x8FD0;&#x884C;tcp&#x670D;&#x52A1;&#x7AEF;">&#x8FD0;&#x884C;tcp&#x670D;&#x52A1;&#x7AEF;</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<!-- tocstop -->
<h2 id="&#x53C2;&#x8003;"><a href="#&#x53C2;&#x8003;" class="headerlink" title="&#x53C2;&#x8003;"></a>&#x53C2;&#x8003;</h2><blockquote>
<p><a href="http://wiki.ros.org/rosbridge_suite" target="_blank" rel="external">rosbridge_suit</a><br><a href="https://github.com/RobotWebTools/rosbridge_suite/blob/develop/ROSBRIDGE_PROTOCOL.md" target="_blank" rel="external">rosbridge v2.0 Protocol Specification</a><br><a href="http://blog.csdn.net/json_ligege/article/details/52070729" target="_blank" rel="external">WebSocket &#x7279;&#x70B9;&#x4E0E;&#x5E94;&#x7528;</a><br><a href="https://lavag.org/topic/19271-tcp-write-json/" target="_blank" rel="external">LabVIEW TCP Write JSON</a><br><a href="http://forums.ni.com/t5/LabVIEW/How-do-you-create-a-Labview-Websocket-client/td-p/2943742" target="_blank" rel="external">LabVIEW websocket client</a><br><a href="http://lvs-tools.co.uk/software/websocket-api-labview-library/" target="_blank" rel="external">client</a><br><a href="http://www.bilibili.com/video/av6293256/" target="_blank" rel="external">rosbridge &#x539F;&#x7406;&#x53CA;&#x5E94;&#x7528;</a></p>
</blockquote>
<h2 id="&#x5B66;&#x4E60;&#x8BB0;&#x5F55;"><a href="#&#x5B66;&#x4E60;&#x8BB0;&#x5F55;" class="headerlink" title="&#x5B66;&#x4E60;&#x8BB0;&#x5F55;"></a>&#x5B66;&#x4E60;&#x8BB0;&#x5F55;</h2><h3 id="rosbridge_suit"><a href="#rosbridge-suit" class="headerlink" title="rosbridge_suit"></a>rosbridge_suit</h3><ul>
<li>&#x8FD9;&#x4E2A;&#x5DE5;&#x5177;&#x5305;&#x63D0;&#x4F9B;JSON API&#x4F9B;&#x975E;ROS&#x7A0B;&#x5E8F;&#x4F7F;&#x7528;&#xFF0C;&#x6709;&#x5F88;&#x591A;&#x524D;&#x7AEF;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#xFF0C;&#x5305;&#x62EC;WebSocket Server&#x3002;</li>
<li>&#x4EFB;&#x4F55;&#x73AF;&#x5883;&#xFF0C;&#x53EA;&#x8981;&#x80FD;&#x591F;&#x53D1;&#x9001;JSON&#x534F;&#x8BAE;&#x6570;&#x636E;&#x4E14;&#x7B26;&#x5408;rosbridge&#x4F20;&#x8F93;&#x534F;&#x8BAE;</li>
<li>&#x6CE8;&#x610F;&#xFF0C;JSON&#x534F;&#x8BAE;&#x548C;TCP&#xFF0C;HTTP&#x4E0D;&#x5728;&#x4E00;&#x4E2A;&#x5C42;&#x6B21;&#x4E0A;&#xFF0C;JSON&#x662F;&#x4E00;&#x79CD;&#x6570;&#x636E;&#x89C4;&#x7EA6;&#xFF0C;&#x89C4;&#x5B9A;&#x53D1;&#x9001;&#x7684;&#x6570;&#x636E;&#x5E94;&#x8BE5;&#x5177;&#x6709;&#x4F55;&#x79CD;&#x683C;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x8BF4;&#xFF0C;JSON&#x5904;&#x5728;OSI&#x4E03;&#x5C42;&#x6807;&#x51C6;&#x534F;&#x8BAE;&#x7684;&#x8868;&#x793A;&#x5C42;&#x3002;</li>
</ul>
<h3 id="websocket-json-api&#x662F;&#x5565;"><a href="#WebSocket-Json-API&#x662F;&#x5565;" class="headerlink" title="WebSocket Json API&#x662F;&#x5565;"></a>WebSocket Json API&#x662F;&#x5565;</h3><ul>
<li>websocket&#x662F;&#x4E00;&#x79CD;&#x5728;&#x5355;&#x4E2A;TCP&#x8FDE;&#x63A5;&#x4E0A;&#x8FDB;&#x884C;&#x5168;&#x53CC;&#x5DE5;&#x901A;&#x8BAF;&#x7684;&#x534F;&#x8BAE;&#x3002;&#x5C06;&#x5957;&#x63A5;&#x5B57;&#x5F15;&#x5165;&#x7F51;&#x7EDC;&#x3002;</li>
<li>&#x901A;&#x4FD7;&#x7684;&#x8BB2;&#xFF0C;&#x5C31;&#x662F;&#x901A;&#x8FC7;&#x6D4F;&#x89C8;&#x5668;&#x8FD0;&#x884C;&#x7A0B;&#x5E8F;&#xFF0C;&#x5728;B/S&#x67B6;&#x6784;&#x4E0B;&#x4E0E;&#x672C;&#x5730;&#x8FD0;&#x884C;&#x7684;&#x8F6F;&#x4EF6;&#x8FDB;&#x884C;&#x901A;&#x8BAF;&#xFF0C;&#x5B8C;&#x6210;&#x5957;&#x63A5;&#x5B57;&#x7684;&#x76F8;&#x5173;&#x529F;&#x80FD;&#x3002;</li>
</ul>
<h3 id="rosbridge20&#x534F;&#x8BAE;&#x89C4;&#x7EA6;"><a href="#rosbridge2-0&#x534F;&#x8BAE;&#x89C4;&#x7EA6;" class="headerlink" title="rosbridge2.0&#x534F;&#x8BAE;&#x89C4;&#x7EA6;"></a>rosbridge2.0&#x534F;&#x8BAE;&#x89C4;&#x7EA6;</h3><ul>
<li>rosbridge&#x6D88;&#x606F;&#x7684;&#x4F20;&#x8F93;&#x5C42;&#x662F;JSON&#x5BF9;&#x8C61;&#xFF0C;&#x4EC5;&#x4EC5;&#x9700;&#x8981;&#x7684;&#x5B57;&#x6BB5;&#x662F;&#x2019;op&#x2019;&#x5B57;&#x6BB5;&#xFF0C;&#x8868;&#x793A;&#x6D88;&#x606F;&#x7684;&#x64CD;&#x4F5C;&#xFF08;operation&#xFF09;&#xFF0C;&#x800C;&#x6574;&#x4E2A;&#x534F;&#x8BAE;&#x5C31;&#x662F;&#x2019;op&#x2019;codes&#x7684;&#x96C6;&#x5408;&#xFF0C;&#x518D;&#x52A0;&#x4E0A;&#x6BCF;&#x4E00;&#x4E2A;&#x64CD;&#x4F5C;&#x7684;&#x8BED;&#x4E49;&#x3002;</li>
</ul>
<h4 id="&#x4F20;&#x8F93;&#x5C42;"><a href="#&#x4F20;&#x8F93;&#x5C42;" class="headerlink" title="&#x4F20;&#x8F93;&#x5C42;"></a>&#x4F20;&#x8F93;&#x5C42;</h4><ul>
<li>&#x4E00;&#x4E2A;&#x6D88;&#x606F;&#x5C31;&#x662F;&#x4E00;&#x4E2A;JSON&#x5BF9;&#x8C61;&#xFF0C;&#x7C7B;&#x4F3C;&#x4E8E;&#x4E0B;&#x9762;&#x7684;&#x952E;&#x503C;&#x5BF9;&#xFF1A;</li>
</ul>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{&#x201C;op&#x201D;: &quot;Example&quot; }</span><br></pre></td></tr></table></figure>
<ul>
<li>&#x8BF7;&#x6CE8;&#x610F;&#xFF0C;&#x4F9D;&#x7136;&#x80FD;&#x591F;&#x63D0;&#x4F9B;&#x4EFB;&#x610F;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x952E;&#x503C;&#x5BF9;&#xFF0C;&#x5982;</li>
</ul>
<figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">{<span class="attr">&quot;op&quot;</span>: &#x201C;Example&#x201D;</span><br><span class="line">    <span class="string">&quot;id&quot;</span>: <span class="string">&quot;fred&quot;</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>&#x4F46;&#x662F;&#x8BF7;&#x6CE8;&#x610F;&#xFF0C;&#x201D;id&#x201D;&#x952E;&#x53EF;&#x80FD;&#x5E76;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x91CA;&#x4E49;&#xFF0C;&#x4F46;&#x662F;&#x5728;&#x670D;&#x52A1;&#x7AEF;&#x53EF;&#x4EE5;&#x88AB;&#x8BBE;&#x8BA1;&#x4E3A;&#x4E00;&#x4E2A;&#x7279;&#x5B9A;&#x7684;&#x542B;&#x4E49;&#x3002;</p>
<h4 id="&#x534F;&#x8BAE;&#x89C4;&#x7EA6;&#x4E3B;&#x8981;&#x5206;&#x7C7B;"><a href="#&#x534F;&#x8BAE;&#x89C4;&#x7EA6;&#x4E3B;&#x8981;&#x5206;&#x7C7B;" class="headerlink" title="&#x534F;&#x8BAE;&#x89C4;&#x7EA6;&#x4E3B;&#x8981;&#x5206;&#x7C7B;"></a>&#x534F;&#x8BAE;&#x89C4;&#x7EA6;&#x4E3B;&#x8981;&#x5206;&#x7C7B;</h4><ul>
<li>&#x6D88;&#x606F;&#x538B;&#x7F29;&#x548C;&#x8F6C;&#x6362;<ul>
<li>fragment - &#x5206;&#x6BB5;&#x6D88;&#x606F;&#x7684;&#x4E00;&#x4E2A;&#x90E8;&#x5206;</li>
<li>png - &#x56FE;&#x7247;&#x5206;&#x6BB5;&#x6D88;&#x606F;&#x7684;&#x4E00;&#x4E2A;&#x90E8;&#x5206;</li>
</ul>
</li>
<li>&#x72B6;&#x6001;&#x6D88;&#x606F;<ul>
<li>set_status_level - &#x8BBE;&#x7F6E;&#x72B6;&#x6001;&#x6D88;&#x606F;&#x62A5;&#x544A;&#x7B49;&#x7EA7;&#x7684;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;&#x6D88;&#x606F;</li>
<li>status - &#x4E00;&#x4E2A;&#x72B6;&#x6001;&#x6D88;&#x606F;</li>
</ul>
</li>
<li>&#x786E;&#x8BA4;&#x6D88;&#x606F;<ul>
<li>auth - &#x786E;&#x8BA4;&#x6216;&#x8005;&#x6388;&#x6743;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x8FDE;&#x63A5;</li>
</ul>
</li>
<li>ROS&#x6D88;&#x606F;</li>
</ul>
<h3 id="ros&#x6D88;&#x606F;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;"><a href="#ROS&#x6D88;&#x606F;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;" class="headerlink" title="ROS&#x6D88;&#x606F;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;"></a>ROS&#x6D88;&#x606F;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;</h3><ul>
<li>&#x6CE8;&#x518C;&#xFF08;Advertise&#xFF09;</li>
</ul>
<h4 id="341-advertise-advertise"><a href="#3-4-1-Advertise-advertise" class="headerlink" title="3.4.1 Advertise ( advertise )"></a>3.4.1 Advertise ( <em>advertise</em> )</h4><p>If you wish to advertise that you are or will be publishing a topic, then use the advertise command.</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">{ &quot;op&quot;: &quot;advertise&quot;,  (optional) &quot;id&quot;: &lt;string&gt;,  &quot;topic&quot;: &lt;string&gt;,  &quot;type&quot;: &lt;string&gt; } </span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line"> * **topic** &#x2013; the string name of the topic to advertise </span><br><span class="line"> * **type** &#x2013; the string type to advertise for the topic  </span><br><span class="line"> * If the topic does not already exist, and the type specified is a valid  type, then the topic will be established with this type. </span><br><span class="line"> * If the topic already exists with a different type, an error status message     is sent and this message is dropped</span><br><span class="line"> * If the topic already exists with the same type, the sender of this message     is registered as another publisher.</span><br><span class="line"> * If the topic doesnt already exist but the type cannot be resolved, then an     error status message is sent and this message is dropped. </span><br><span class="line"></span><br><span class="line">#### 3.4.2 Unadvertise ( _unadvertise_ ) This stops advertising that you are publishing a topic. </span><br><span class="line"></span><br><span class="line">```json </span><br><span class="line">{ &quot;op&quot;: &quot;unadvertise&quot;,  (optional) &quot;id&quot;: &lt;string&gt;,  &quot;topic&quot;: &lt;string&gt; }</span><br></pre></td></tr></table></figure>
<ul>
<li><strong>topic</strong> &#x2013; the string name of the topic being unadvertised  </li>
<li>If the topic does not exist, a warning status message is sent and this     message is dropped  </li>
<li>If the topic exists and there are still clients left advertising it,     rosbridge will continue to advertise it until all of them have unadvertised  </li>
<li>If the topic exists but rosbridge is not advertising it, a warning status     message is sent and this message is dropped</li>
</ul>
<h4 id="343-publish-publish"><a href="#3-4-3-Publish-publish" class="headerlink" title="3.4.3 Publish ( publish )"></a>3.4.3 Publish ( <em>publish</em> )</h4><p>The publish message is used to send data on a topic. </p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{ &quot;op&quot;: &quot;publish&quot;,  (optional) &quot;id&quot;: &lt;string&gt;,  &quot;topic&quot;: &lt;string&gt;,  &quot;msg&quot;: &lt;json&gt; }</span><br></pre></td></tr></table></figure>
<p> The publish command publishes a message on a topic.</p>
<ul>
<li><strong>topic</strong> - the string name of the topic to publish to</li>
<li><strong>msg</strong> - the message to publish on the topic  </li>
<li>If the topic does not exist, then an error status message is sent and this     message is dropped  </li>
<li>If the msg does not conform to the type of the topic, then an error status     message is sent and this message is dropped  </li>
<li>If the msg is a subset of the type of the topic, then a warning status     message is sent and the unspecified fields are filled in with defaults Special case: if the type being published has a &#x2018;header&#x2019; field, then the client can optionally omit the header from the msg. If this happens, rosbridge will automatically populate the header with a frame id of &#x201C;&#x201D; and the timestamp as the current time. Alternatively, just the timestamp field can be omitted, and then the current time will be automatically inserted.</li>
</ul>
<h4 id="344-subscribe"><a href="#3-4-4-Subscribe" class="headerlink" title="3.4.4 Subscribe"></a>3.4.4 Subscribe</h4><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"> { &quot;op&quot;: &quot;subscribe&quot;,  (optional) &quot;id&quot;: &lt;string&gt;,  &quot;topic&quot;: &lt;string&gt;,  (optional) &quot;type&quot;: &lt;string&gt;,  (optional) &quot;throttle_rate&quot;: &lt;int&gt;,  (optional) &quot;queue_length&quot;: &lt;int&gt;,  (optional) &quot;fragment_size&quot;: &lt;int&gt;,  (optional) &quot;compression&quot;: &lt;string&gt; }</span><br><span class="line">``` </span><br><span class="line"></span><br><span class="line">This command subscribes the client to the specified topic. It is recommended that if the client has multiple components subscribing to the same topic, that each component makes its own subscription request providing an ID. That way, each can individually unsubscribe and rosbridge can select the correct rate at which to send messages.</span><br><span class="line"> * **type** &#x2013; the (expected) type of the topic to subscribe to. If left off,    type will be inferred, and if the topic doesn&apos;t exist then the command to    subscribe will fail</span><br><span class="line"> * **topic** &#x2013; the name of the topic to subscribe to</span><br><span class="line"> * **throttle_rate** &#x2013; the minimum amount of time (in ms) that must elapse    between messages being sent. Defaults to 0</span><br><span class="line"> * **queue_length** &#x2013; the size of the queue to buffer messages. Messages are    buffered as a result of the throttle_rate. Defaults to 1.</span><br><span class="line"> * **id** &#x2013; if specified, then this specific subscription can be unsubscribed    by referencing the ID. </span><br><span class="line"> * **fragment_size** &#x2013; the maximum size that a message can take before it is to    be fragmented.</span><br><span class="line"> * **compression** &#x2013; an optional string to specify the compression scheme to be    used on messages. Valid values are &quot;none&quot; and &quot;png&quot; If queue_length is specified, then messages are placed into the queue before being sent. Messages are sent from the head of the queue. If the queue gets full, the oldest message is removed and replaced by the newest message. If a client has multiple subscriptions to the same topic, then messages are sent at the lowest throttle_rate, with the lowest fragmentation size, and highest queue_length. It is recommended that the client provides IDs for its subscriptions, to enable rosbridge to effectively choose the appropriate fragmentation size and publishing rate. </span><br><span class="line"></span><br><span class="line">#### 3.4.5 Unsubscribe </span><br><span class="line"></span><br><span class="line">```json</span><br><span class="line"> { &quot;op&quot;: &quot;unsubscribe&quot;,  (optional) &quot;id&quot;: &lt;string&gt;,  &quot;topic&quot;: &lt;string&gt; }</span><br></pre></td></tr></table></figure>
<ul>
<li><strong>topic</strong> &#x2013; the name of the topic to unsubscribe from</li>
<li><strong>id</strong> &#x2013; an id of the subscription to unsubscribe If an id is provided, then only the corresponding subscription is unsubscribed. If no ID is provided, then all subscriptions are unsubscribed. </li>
</ul>
<h4 id="346-call-service"><a href="#3-4-6-Call-Service" class="headerlink" title="3.4.6 Call Service"></a>3.4.6 Call Service</h4><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{ &quot;op&quot;: &quot;call_service&quot;,  (optional) &quot;id&quot;: &lt;string&gt;,  &quot;service&quot;: &lt;string&gt;,  (optional) &quot;args&quot;: &lt;list&lt;json&gt;&gt;,  (optional) &quot;fragment_size&quot;: &lt;int&gt;,  (optional) &quot;compression&quot;: &lt;string&gt; }</span><br></pre></td></tr></table></figure>
<p>Calls a ROS service </p>
<ul>
<li><strong>service</strong> &#x2013; the name of the service to call</li>
<li><strong>args</strong> &#x2013; if the service has no args, then args does not have to be    provided, though an empty list is equally acceptable. Args should be a list    of json objects representing the arguments to the service</li>
<li><strong>id</strong> &#x2013; an optional id to distinguish this service call</li>
<li><strong>fragment_size</strong> &#x2013; the maximum size that the response message can take    before it is fragmented</li>
<li><strong>compression</strong> &#x2013; an optional string to specify the compression scheme to be    used on messages. Valid values are &#x201C;none&#x201D; and &#x201C;png&#x201D; </li>
</ul>
<h4 id="347-advertise-service"><a href="#3-4-7-Advertise-Service" class="headerlink" title="3.4.7 Advertise Service"></a>3.4.7 Advertise Service</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{ <span class="attr">&quot;op&quot;</span>: <span class="string">&quot;advertise_service&quot;</span>,  <span class="attr">&quot;type&quot;</span>: &lt;string&gt;,  <span class="attr">&quot;service&quot;</span>: &lt;string&gt; }</span><br></pre></td></tr></table></figure>
<p>Advertises an external ROS service server. Requests come to the client via Call Service.</p>
<ul>
<li><strong>service</strong> &#x2013; the name of the service to advertise</li>
<li><strong>type</strong> &#x2013; the advertised service message type </li>
</ul>
<h4 id="348-unadvertise-service"><a href="#3-4-8-Unadvertise-Service" class="headerlink" title="3.4.8 Unadvertise Service"></a>3.4.8 Unadvertise Service</h4><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{ <span class="attr">&quot;op&quot;</span>: <span class="string">&quot;unadvertise_service&quot;</span>,  <span class="attr">&quot;service&quot;</span>: &lt;string&gt; }</span><br></pre></td></tr></table></figure>
<p> Stops advertising an external ROS service server</p>
<ul>
<li><strong>service</strong> &#x2013; the name of the service to unadvertise </li>
</ul>
<h4 id="349-service-response"><a href="#3-4-9-Service-Response" class="headerlink" title="3.4.9 Service Response"></a>3.4.9 Service Response</h4><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{ &quot;op&quot;: &quot;service_response&quot;,  (optional) &quot;id&quot;: &lt;string&gt;,  &quot;service&quot;: &lt;string&gt;,  (optional) &quot;values&quot;: &lt;list&lt;json&gt;&gt;,  &quot;result&quot;: &lt;boolean&gt; }</span><br></pre></td></tr></table></figure>
<p>A response to a ROS service call</p>
<ul>
<li><strong>service</strong> &#x2013; the name of the service that was called</li>
<li><strong>values</strong> &#x2013; the return values. If the service had no return values, then    this field can be omitted (and will be by the rosbridge server)</li>
<li><strong>id</strong> &#x2013; if an ID was provided to the service request, then the service    response will contain the ID</li>
<li><strong>result</strong> - return value of service callback. true means success, false failure.</li>
</ul>
<h3 id="rosbridge-server-implementation"><a href="#rosbridge-server-implementation" class="headerlink" title="rosbridge server implementation"></a>rosbridge server implementation</h3><ul>
<li>&#x7ED9;&#x51FA;&#x670D;&#x52A1;&#x7AEF;&#x7684;&#x5B9E;&#x73B0;&#x7EC6;&#x8282;&#x662F;&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x4FEE;&#x6539;&#x534F;&#x8BAE;</li>
</ul>
<h3 id="labview-json-tcp"><a href="#LabVIEW-JSON-TCP" class="headerlink" title="LabVIEW JSON TCP"></a>LabVIEW JSON TCP</h3><ul>
<li>LabVIEW2014&#x62E5;&#x6709;&#x201C;&#x7C07;&#x5E73;&#x5316;&#x81F3;JSON&#x5B57;&#x7B26;&#x4E32;&#x201D;&#x4EE5;&#x53CA;&#x201C;&#x4ECE;JSON&#x6062;&#x590D;&#x201D;vi&#x51FD;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x5B8C;&#x6210;&#x4E0A;&#x8FF0;&#x9700;&#x6C42;&#xFF0C;&#x6211;&#x867D;&#x7136;&#x4E5F;&#x627E;&#x5230;&#x4E00;&#x4E9B;JSON&#x63D2;&#x4EF6;&#xFF0C;&#x4F46;&#x662F;&#x8C8C;&#x4F3C;&#x6CA1;&#x6709;&#x4F7F;&#x7528;&#x7684;&#x5FC5;&#x8981;&#xFF0C;&#x90FD;&#x662F;&#x6BD4;&#x8F83;&#x8001;&#x7684;&#x5E93;&#xFF0C;&#x65B0;&#x7248;&#x672C;&#x7684;LV&#x5DF2;&#x7ECF;&#x5305;&#x542B;&#x4E86;&#x8FD9;&#x4E00;&#x529F;&#x80FD;</li>
</ul>
<h3 id="rosbridge-suit&#x4F7F;&#x7528;"><a href="#rosbridge-suit&#x4F7F;&#x7528;" class="headerlink" title="rosbridge-suit&#x4F7F;&#x7528;"></a>rosbridge-suit&#x4F7F;&#x7528;</h3><h4 id="&#x5B89;&#x88C5;"><a href="#&#x5B89;&#x88C5;" class="headerlink" title="&#x5B89;&#x88C5;"></a>&#x5B89;&#x88C5;</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install ros-indigo-rosbridge-suit</span><br></pre></td></tr></table></figure>
<h4 id="&#x8FD0;&#x884C;tcp&#x670D;&#x52A1;&#x7AEF;"><a href="#&#x8FD0;&#x884C;tcp&#x670D;&#x52A1;&#x7AEF;" class="headerlink" title="&#x8FD0;&#x884C;tcp&#x670D;&#x52A1;&#x7AEF;"></a>&#x8FD0;&#x884C;tcp&#x670D;&#x52A1;&#x7AEF;</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rosrun rosbridge_server rosbridge_tcp</span><br><span class="line">rqt_graph</span><br></pre></td></tr></table></figure>
      

      
        <div class="page-reward">
          <a href="javascript:;" class="page-reward-btn tooltip-top">
            <div class="tooltip tooltip-east">
            <span class="tooltip-item">
              赏
            </span>
            <span class="tooltip-content">
              <span class="tooltip-text">
                <span class="tooltip-inner">
                  <p class="reward-p"><i class="icon icon-quo-left"></i>谢谢你请我吃糖果<i class="icon icon-quo-right"></i></p>
                  <div class="reward-box">
                    
                    <div class="reward-box-item">
                      <img class="reward-img" src="http://7xvunf.com1.z0.glb.clouddn.com/alipay.jpg">
                      <span class="reward-type">支付宝</span>
                    </div>
                    
                    
                    <div class="reward-box-item">
                      <img class="reward-img" src="http://7xvunf.com1.z0.glb.clouddn.com/wechatpay.jpg">
                      <span class="reward-type">微信</span>
                    </div>
                    
                  </div>
                </span>
              </span>
            </span>
          </div>
          </a>
        </div>
      
    </div>
    <div class="article-info article-info-index">
      
      
	<div class="article-tag tagcloud">
		<i class="icon-price-tags"></i>
		<ul class="article-tag-list">
			 
        <li class="article-tag-list-item">
        	<a href="javascript:void(0)" class="article-tag-list-link color4">机器人</a>
        </li>
       
        <li class="article-tag-list-item">
        	<a href="javascript:void(0)" class="article-tag-list-link color3">机器人软件设计</a>
        </li>
       
        <li class="article-tag-list-item">
        	<a href="javascript:void(0)" class="article-tag-list-link color4">ROS</a>
        </li>
      
		</ul>
	</div>

      

      

      
        
<div class="share-btn share-icons tooltip-left">
  <div class="tooltip tooltip-east">
    <span class="tooltip-item">
      <a href="javascript:;" class="share-sns share-outer">
        <i class="icon icon-share"></i>
      </a>
    </span>
    <span class="tooltip-content">
      <div class="share-wrap">
        <div class="share-icons">
          <a class="weibo share-sns" href="javascript:;" data-type="weibo">
            <i class="icon icon-weibo"></i>
          </a>
          <a class="weixin share-sns wxFab" href="javascript:;" data-type="weixin">
            <i class="icon icon-weixin"></i>
          </a>
          <a class="qq share-sns" href="javascript:;" data-type="qq">
            <i class="icon icon-qq"></i>
          </a>
          <a class="douban share-sns" href="javascript:;" data-type="douban">
            <i class="icon icon-douban"></i>
          </a>
          <a class="qzone share-sns" href="javascript:;" data-type="qzone">
            <i class="icon icon-qzone"></i>
          </a>
          <a class="facebook share-sns" href="javascript:;" data-type="facebook">
            <i class="icon icon-facebook"></i>
          </a>
          <a class="twitter share-sns" href="javascript:;" data-type="twitter">
            <i class="icon icon-twitter"></i>
          </a>
          <a class="google share-sns" href="javascript:;" data-type="google">
            <i class="icon icon-google"></i>
          </a>
        </div>
      </div>
    </span>
  </div>
</div>

<div class="page-modal wx-share js-wx-box">
    <a class="close js-modal-close" href="javascript:;"><i class="icon icon-close"></i></a>
    <p>扫一扫，分享到微信</p>
    <div class="wx-qrcode">
      <img src="http://s.jiathis.com/qrcode.php?url=https://ZhenshengLee.github.io/2017/01/03/170103-ROSBridgeSuit/" alt="微信分享二维码">
    </div>
</div>

<div class="mask js-mask"></div>
      
      <div class="clearfix"></div>
    </div>
  </div>
</article>

  
<nav id="article-nav">
  
    <a href="/2017/01/03/170103-ROSARIA总结/" id="article-nav-newer" class="article-nav-link-wrap">
      <i class="icon-circle-left"></i>
      <div class="article-nav-title">
        
          ROSARIA使用总结
        
      </div>
    </a>
  
  
    <a href="/2017/01/03/170103-ROSCpp/" id="article-nav-older" class="article-nav-link-wrap">
      <div class="article-nav-title">ROSCpp-ROS线程模型</div>
      <i class="icon-circle-right"></i>
    </a>
  
</nav>






  
  <div class="duoshuo">
	<!-- 多说评论框 start -->
	<div class="ds-thread" data-thread-key="170103-ROSBridgeSuit" data-title="ROSBridgeSuit" data-url="https://ZhenshengLee.github.io/2017/01/03/170103-ROSBridgeSuit/"></div>
	<!-- 多说评论框 end -->
	<!-- 多说公共JS代码 start (一个网页只需插入一次) -->
	<script type="text/javascript">
	var duoshuoQuery = {short_name:"true"};
	(function() {
		var ds = document.createElement('script');
		ds.type = 'text/javascript';ds.async = true;
		ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
		ds.charset = 'UTF-8';
		(document.getElementsByTagName('head')[0] 
		 || document.getElementsByTagName('body')[0]).appendChild(ds);
	})();
	</script>
	<!-- 多说公共JS代码 end -->
</div>

  




          </div>
        </div>
      </div>
      <footer id="footer">
  <div class="outer">
    <div id="footer-info">
    	<div class="footer-left">
    		&copy; 2017 黎振胜
    	</div>
      	<div class="footer-right">
      		<a href="http://hexo.io/" target="_blank">Hexo</a>  Theme <a href="https://github.com/litten/hexo-theme-yilia" target="_blank">Yilia</a> by Litten
      	</div>
    </div>
  </div>
</footer>
    </div>
    <script>
	var yiliaConfig = {
		mathjax: true,
		isHome: false,
		isPost: true,
		isArchive: false,
		isTag: false,
		isCategory: false,
		open_in_new: false,
		root: "/",
		innerArchive: true,
		showTags: false
	}
</script>

<script>
!function(t){function n(r){if(e[r])return e[r].exports;var o=e[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var e={};return n.m=t,n.c=e,n.p="/",n(0)}([function(t,n,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,n){var e=/\/|index.html/g;return t.replace(e,"")===n.replace(e,"")}function i(){for(var t=document.querySelectorAll(".js-header-menu li a"),n=window.location.pathname,e=0,r=t.length;e<r;e++){var i=t[e];o(n,i.getAttribute("href"))&&(0,d.default)(i,"active")}}function u(t){for(var n=t.offsetLeft,e=t.offsetParent;null!==e;)n+=e.offsetLeft,e=e.offsetParent;return n}function f(t){for(var n=t.offsetTop,e=t.offsetParent;null!==e;)n+=e.offsetTop,e=e.offsetParent;return n}function c(t,n,e,r,o){var i=u(t),c=f(t)-n;if(c-e<=o){var a=t.$newDom;a||(a=t.cloneNode(!0),(0,h.default)(t,a),t.$newDom=a,a.style.position="fixed",a.style.top=(e||c)+"px",a.style.left=i+"px",a.style.zIndex=r||2,a.style.width="100%",a.style.color="#fff"),a.style.visibility="visible",t.style.visibility="hidden"}else{t.style.visibility="visible";var s=t.$newDom;s&&(s.style.visibility="hidden")}}function a(){var t=document.querySelector(".js-overlay"),n=document.querySelector(".js-header-menu");c(t,document.body.scrollTop,-63,2,0),c(n,document.body.scrollTop,1,3,0)}function s(){document.querySelector("#container").addEventListener("scroll",function(t){a()}),window.addEventListener("scroll",function(t){a()}),a()}function l(){x.default.versions.mobile&&window.screen.width<800&&(i(),s())}var p=e(71),d=r(p),v=e(72),y=(r(v),e(84)),h=r(y),b=e(69),x=r(b),m=e(75),g=r(m),w=e(70);l(),(0,w.addLoadEvent)(function(){g.default.init()}),t.exports={}},function(t,n){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(49),o=e(15);t.exports=function(t){return r(o(t))}},function(t,n,e){t.exports=!e(8)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,n,e){var r=e(6),o=e(12);t.exports=e(4)?function(t,n,e){return r.f(t,n,o(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(10),o=e(30),i=e(24),u=Object.defineProperty;n.f=e(4)?Object.defineProperty:function(t,n,e){if(r(t),n=i(n,!0),r(e),o)try{return u(t,n,e)}catch(t){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(22)("wks"),o=e(13),i=e(1).Symbol,u="function"==typeof i,f=t.exports=function(t){return r[t]||(r[t]=u&&i[t]||(u?i:o)("Symbol."+t))};f.store=r},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r=e(35),o=e(16);t.exports=Object.keys||function(t){return r(t,o)}},function(t,n,e){var r=e(11);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++e+r).toString(36))}},function(t,n){var e=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=e)},function(t,n){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on  "+t);return t}},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n){t.exports={}},function(t,n){t.exports=!0},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,e){var r=e(6).f,o=e(2),i=e(7)("toStringTag");t.exports=function(t,n,e){t&&!o(t=e?t:t.prototype,i)&&r(t,i,{configurable:!0,value:n})}},function(t,n,e){var r=e(22)("keys"),o=e(13);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,n,e){var r=e(1),o="__core-js_shared__",i=r[o]||(r[o]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},function(t,n,e){var r=e(11);t.exports=function(t,n){if(!r(t))return t;var e,o;if(n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;if("function"==typeof(e=t.valueOf)&&!r(o=e.call(t)))return o;if(!n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,n,e){var r=e(1),o=e(14),i=e(18),u=e(26),f=e(6).f;t.exports=function(t){var n=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==t.charAt(0)||t in n||f(n,t,{value:u.f(t)})}},function(t,n,e){n.f=e(7)},function(t,n,e){var r=e(1),o=e(14),i=e(46),u=e(5),f="prototype",c=function(t,n,e){var a,s,l,p=t&c.F,d=t&c.G,v=t&c.S,y=t&c.P,h=t&c.B,b=t&c.W,x=d?o:o[n]||(o[n]={}),m=x[f],g=d?r:v?r[n]:(r[n]||{})[f];d&&(e=n);for(a in e)s=!p&&g&&void 0!==g[a],s&&a in x||(l=s?g[a]:e[a],x[a]=d&&"function"!=typeof g[a]?e[a]:h&&s?i(l,r):b&&g[a]==l?function(t){var n=function(n,e,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,e)}return new t(n,e,r)}return t.apply(this,arguments)};return n[f]=t[f],n}(l):y&&"function"==typeof l?i(Function.call,l):l,y&&((x.virtual||(x.virtual={}))[a]=l,t&c.R&&m&&!m[a]&&u(m,a,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n,e){var r=e(11),o=e(1).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,n,e){t.exports=!e(4)&&!e(8)(function(){return 7!=Object.defineProperty(e(29)("div"),"a",{get:function(){return 7}}).a})},function(t,n,e){"use strict";var r=e(18),o=e(27),i=e(36),u=e(5),f=e(2),c=e(17),a=e(51),s=e(20),l=e(58),p=e(7)("iterator"),d=!([].keys&&"next"in[].keys()),v="@@iterator",y="keys",h="values",b=function(){return this};t.exports=function(t,n,e,x,m,g,w){a(e,n,x);var O,S,_,j=function(t){if(!d&&t in A)return A[t];switch(t){case y:return function(){return new e(this,t)};case h:return function(){return new e(this,t)}}return function(){return new e(this,t)}},P=n+" Iterator",E=m==h,M=!1,A=t.prototype,T=A[p]||A[v]||m&&A[m],L=T||j(m),N=m?E?j("entries"):L:void 0,C="Array"==n?A.entries||T:T;if(C&&(_=l(C.call(new t)),_!==Object.prototype&&(s(_,P,!0),r||f(_,p)||u(_,p,b))),E&&T&&T.name!==h&&(M=!0,L=function(){return T.call(this)}),r&&!w||!d&&!M&&A[p]||u(A,p,L),c[n]=L,c[P]=b,m)if(O={values:E?L:j(h),keys:g?L:j(y),entries:N},w)for(S in O)S in A||i(A,S,O[S]);else o(o.P+o.F*(d||M),n,O);return O}},function(t,n,e){var r=e(10),o=e(55),i=e(16),u=e(21)("IE_PROTO"),f=function(){},c="prototype",a=function(){var t,n=e(29)("iframe"),r=i.length,o="<",u=">";for(n.style.display="none",e(48).appendChild(n),n.src="javascript:",t=n.contentWindow.document,t.open(),t.write(o+"script"+u+"document.F=Object"+o+"/script"+u),t.close(),a=t.F;r--;)delete a[c][i[r]];return a()};t.exports=Object.create||function(t,n){var e;return null!==t?(f[c]=r(t),e=new f,f[c]=null,e[u]=t):e=a(),void 0===n?e:o(e,n)}},function(t,n,e){var r=e(35),o=e(16).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(2),o=e(3),i=e(45)(!1),u=e(21)("IE_PROTO");t.exports=function(t,n){var e,f=o(t),c=0,a=[];for(e in f)e!=u&&r(f,e)&&a.push(e);for(;n.length>c;)r(f,e=n[c++])&&(~i(a,e)||a.push(e));return a}},function(t,n,e){t.exports=e(5)},function(t,n,e){var r=e(15);t.exports=function(t){return Object(r(t))}},function(t,n,e){t.exports={default:e(41),__esModule:!0}},function(t,n,e){t.exports={default:e(42),__esModule:!0}},function(t,n,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var o=e(39),i=r(o),u=e(38),f=r(u),c="function"==typeof f.default&&"symbol"==typeof i.default?function(t){return typeof t}:function(t){return t&&"function"==typeof f.default&&t.constructor===f.default&&t!==f.default.prototype?"symbol":typeof t};n.default="function"==typeof f.default&&"symbol"===c(i.default)?function(t){return"undefined"==typeof t?"undefined":c(t)}:function(t){return t&&"function"==typeof f.default&&t.constructor===f.default&&t!==f.default.prototype?"symbol":"undefined"==typeof t?"undefined":c(t)}},function(t,n,e){e(65),e(63),e(66),e(67),t.exports=e(14).Symbol},function(t,n,e){e(64),e(68),t.exports=e(26).f("iterator")},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,n){t.exports=function(){}},function(t,n,e){var r=e(3),o=e(61),i=e(60);t.exports=function(t){return function(n,e,u){var f,c=r(n),a=o(c.length),s=i(u,a);if(t&&e!=e){for(;a>s;)if(f=c[s++],f!=f)return!0}else for(;a>s;s++)if((t||s in c)&&c[s]===e)return t||s||0;return!t&&-1}}},function(t,n,e){var r=e(43);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},function(t,n,e){var r=e(9),o=e(34),i=e(19);t.exports=function(t){var n=r(t),e=o.f;if(e)for(var u,f=e(t),c=i.f,a=0;f.length>a;)c.call(t,u=f[a++])&&n.push(u);return n}},function(t,n,e){t.exports=e(1).document&&document.documentElement},function(t,n,e){var r=e(28);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,n,e){var r=e(28);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,n,e){"use strict";var r=e(32),o=e(12),i=e(20),u={};e(5)(u,e(7)("iterator"),function(){return this}),t.exports=function(t,n,e){t.prototype=r(u,{next:o(1,e)}),i(t,n+" Iterator")}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,e){var r=e(9),o=e(3);t.exports=function(t,n){for(var e,i=o(t),u=r(i),f=u.length,c=0;f>c;)if(i[e=u[c++]]===n)return e}},function(t,n,e){var r=e(13)("meta"),o=e(11),i=e(2),u=e(6).f,f=0,c=Object.isExtensible||function(){return!0},a=!e(8)(function(){return c(Object.preventExtensions({}))}),s=function(t){u(t,r,{value:{i:"O"+ ++f,w:{}}})},l=function(t,n){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!n)return"E";s(t)}return t[r].i},p=function(t,n){if(!i(t,r)){if(!c(t))return!0;if(!n)return!1;s(t)}return t[r].w},d=function(t){return a&&v.NEED&&c(t)&&!i(t,r)&&s(t),t},v=t.exports={KEY:r,NEED:!1,fastKey:l,getWeak:p,onFreeze:d}},function(t,n,e){var r=e(6),o=e(10),i=e(9);t.exports=e(4)?Object.defineProperties:function(t,n){o(t);for(var e,u=i(n),f=u.length,c=0;f>c;)r.f(t,e=u[c++],n[e]);return t}},function(t,n,e){var r=e(19),o=e(12),i=e(3),u=e(24),f=e(2),c=e(30),a=Object.getOwnPropertyDescriptor;n.f=e(4)?a:function(t,n){if(t=i(t),n=u(n,!0),c)try{return a(t,n)}catch(t){}if(f(t,n))return o(!r.f.call(t,n),t[n])}},function(t,n,e){var r=e(3),o=e(33).f,i={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],f=function(t){try{return o(t)}catch(t){return u.slice()}};t.exports.f=function(t){return u&&"[object Window]"==i.call(t)?f(t):o(r(t))}},function(t,n,e){var r=e(2),o=e(37),i=e(21)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,e){var r=e(23),o=e(15);t.exports=function(t){return function(n,e){var i,u,f=String(o(n)),c=r(e),a=f.length;return c<0||c>=a?t?"":void 0:(i=f.charCodeAt(c),i<55296||i>56319||c+1===a||(u=f.charCodeAt(c+1))<56320||u>57343?t?f.charAt(c):i:t?f.slice(c,c+2):(i-55296<<10)+(u-56320)+65536)}}},function(t,n,e){var r=e(23),o=Math.max,i=Math.min;t.exports=function(t,n){return t=r(t),t<0?o(t+n,0):i(t,n)}},function(t,n,e){var r=e(23),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,n,e){"use strict";var r=e(44),o=e(52),i=e(17),u=e(3);t.exports=e(31)(Array,"Array",function(t,n){this._t=u(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=void 0,o(1)):"keys"==n?o(0,e):"values"==n?o(0,t[e]):o(0,[e,t[e]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,n){},function(t,n,e){"use strict";var r=e(59)(!0);e(31)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,n=this._t,e=this._i;return e>=n.length?{value:void 0,done:!0}:(t=r(n,e),this._i+=t.length,{value:t,done:!1})})},function(t,n,e){"use strict";var r=e(1),o=e(2),i=e(4),u=e(27),f=e(36),c=e(54).KEY,a=e(8),s=e(22),l=e(20),p=e(13),d=e(7),v=e(26),y=e(25),h=e(53),b=e(47),x=e(50),m=e(10),g=e(3),w=e(24),O=e(12),S=e(32),_=e(57),j=e(56),P=e(6),E=e(9),M=j.f,A=P.f,T=_.f,L=r.Symbol,N=r.JSON,C=N&&N.stringify,k="prototype",F=d("_hidden"),q=d("toPrimitive"),I={}.propertyIsEnumerable,B=s("symbol-registry"),D=s("symbols"),W=s("op-symbols"),H=Object[k],K="function"==typeof L,R=r.QObject,J=!R||!R[k]||!R[k].findChild,U=i&&a(function(){return 7!=S(A({},"a",{get:function(){return A(this,"a",{value:7}).a}})).a})?function(t,n,e){var r=M(H,n);r&&delete H[n],A(t,n,e),r&&t!==H&&A(H,n,r)}:A,G=function(t){var n=D[t]=S(L[k]);return n._k=t,n},$=K&&"symbol"==typeof L.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof L},z=function(t,n,e){return t===H&&z(W,n,e),m(t),n=w(n,!0),m(e),o(D,n)?(e.enumerable?(o(t,F)&&t[F][n]&&(t[F][n]=!1),e=S(e,{enumerable:O(0,!1)})):(o(t,F)||A(t,F,O(1,{})),t[F][n]=!0),U(t,n,e)):A(t,n,e)},Y=function(t,n){m(t);for(var e,r=b(n=g(n)),o=0,i=r.length;i>o;)z(t,e=r[o++],n[e]);return t},Q=function(t,n){return void 0===n?S(t):Y(S(t),n)},X=function(t){var n=I.call(this,t=w(t,!0));return!(this===H&&o(D,t)&&!o(W,t))&&(!(n||!o(this,t)||!o(D,t)||o(this,F)&&this[F][t])||n)},V=function(t,n){if(t=g(t),n=w(n,!0),t!==H||!o(D,n)||o(W,n)){var e=M(t,n);return!e||!o(D,n)||o(t,F)&&t[F][n]||(e.enumerable=!0),e}},Z=function(t){for(var n,e=T(g(t)),r=[],i=0;e.length>i;)o(D,n=e[i++])||n==F||n==c||r.push(n);return r},tt=function(t){for(var n,e=t===H,r=T(e?W:g(t)),i=[],u=0;r.length>u;)!o(D,n=r[u++])||e&&!o(H,n)||i.push(D[n]);return i};K||(L=function(){if(this instanceof L)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:void 0),n=function(e){this===H&&n.call(W,e),o(this,F)&&o(this[F],t)&&(this[F][t]=!1),U(this,t,O(1,e))};return i&&J&&U(H,t,{configurable:!0,set:n}),G(t)},f(L[k],"toString",function(){return this._k}),j.f=V,P.f=z,e(33).f=_.f=Z,e(19).f=X,e(34).f=tt,i&&!e(18)&&f(H,"propertyIsEnumerable",X,!0),v.f=function(t){return G(d(t))}),u(u.G+u.W+u.F*!K,{Symbol:L});for(var nt="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),et=0;nt.length>et;)d(nt[et++]);for(var nt=E(d.store),et=0;nt.length>et;)y(nt[et++]);u(u.S+u.F*!K,"Symbol",{for:function(t){return o(B,t+="")?B[t]:B[t]=L(t)},keyFor:function(t){if($(t))return h(B,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){J=!0},useSimple:function(){J=!1}}),u(u.S+u.F*!K,"Object",{create:Q,defineProperty:z,defineProperties:Y,getOwnPropertyDescriptor:V,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),N&&u(u.S+u.F*(!K||a(function(){var t=L();return"[null]"!=C([t])||"{}"!=C({a:t})||"{}"!=C(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!$(t)){for(var n,e,r=[t],o=1;arguments.length>o;)r.push(arguments[o++]);return n=r[1],"function"==typeof n&&(e=n),!e&&x(n)||(n=function(t,n){if(e&&(n=e.call(this,t,n)),!$(n))return n}),r[1]=n,C.apply(N,r)}}}),L[k][q]||e(5)(L[k],q,L[k].valueOf),l(L,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},function(t,n,e){e(25)("asyncIterator")},function(t,n,e){e(25)("observable")},function(t,n,e){e(62);for(var r=e(1),o=e(5),i=e(17),u=e(7)("toStringTag"),f=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],c=0;c<5;c++){var a=f[c],s=r[a],l=s&&s.prototype;l&&!l[u]&&o(l,u,a),i[a]=i.Array}},function(t,n){"use strict";var e={versions:function(){var t=window.navigator.userAgent;return{trident:t.indexOf("Trident")>-1,presto:t.indexOf("Presto")>-1,webKit:t.indexOf("AppleWebKit")>-1,gecko:t.indexOf("Gecko")>-1&&t.indexOf("KHTML")==-1,mobile:!!t.match(/AppleWebKit.*Mobile.*/),ios:!!t.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),android:t.indexOf("Android")>-1||t.indexOf("Linux")>-1,iPhone:t.indexOf("iPhone")>-1||t.indexOf("Mac")>-1,iPad:t.indexOf("iPad")>-1,webApp:t.indexOf("Safari")==-1,weixin:t.indexOf("MicroMessenger")==-1}}()};t.exports=e},function(t,n,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}var o=e(40),i=r(o),u=function(){function t(t,n,e){return n||e?String.fromCharCode(n||e):o[t]||t}function n(t){return l[t]}var e=/&quot;|&lt;|&gt;|&amp;|&nbsp;|&apos;|&#(\d+);|&#(\d+)/g,r=/['<> "&]/g,o={"&quot;":'"',"&lt;":"<","&gt;":">","&amp;":"&","&nbsp;":" "},f=/\u00a0/g,c=/<br\s*\/?>/gi,a=/\r?\n/g,s=/\s/g,l={};for(var p in o)l[o[p]]=p;return o["&apos;"]="'",l["'"]="&#39;",{encode:function(t){return t?(""+t).replace(r,n).replace(a,"<br/>").replace(s,"&nbsp;"):""},decode:function(n){return n?(""+n).replace(c,"\n").replace(e,t).replace(f," "):""},encodeBase16:function(t){if(!t)return t;t+="";for(var n=[],e=0,r=t.length;r>e;e++)n.push(t.charCodeAt(e).toString(16).toUpperCase());return n.join("")},encodeBase16forJSON:function(t){if(!t)return t;t=t.replace(/[\u4E00-\u9FBF]/gi,function(t){return escape(t).replace("%u","\\u")});for(var n=[],e=0,r=t.length;r>e;e++)n.push(t.charCodeAt(e).toString(16).toUpperCase());return n.join("")},decodeBase16:function(t){if(!t)return t;t+="";for(var n=[],e=0,r=t.length;r>e;e+=2)n.push(String.fromCharCode("0x"+t.slice(e,e+2)));return n.join("")},encodeObject:function(t){if(t instanceof Array)for(var n=0,e=t.length;e>n;n++)t[n]=u.encodeObject(t[n]);else if("object"==("undefined"==typeof t?"undefined":(0,i.default)(t)))for(var r in t)t[r]=u.encodeObject(t[r]);else if("string"==typeof t)return u.encode(t);return t},loadScript:function(t){var n=document.createElement("script");document.getElementsByTagName("body")[0].appendChild(n),n.setAttribute("src",t)},addLoadEvent:function(t){var n=window.onload;"function"!=typeof window.onload?window.onload=t:window.onload=function(){n(),t()}}}}();t.exports=u},function(t,n){function e(t,n){t.classList?t.classList.add(n):t.className+=" "+n}t.exports=e},function(t,n){function e(t,n){if(t.classList)t.classList.remove(n);else{var e=new RegExp("(^|\\b)"+n.split(" ").join("|")+"(\\b|$)","gi");t.className=t.className.replace(e," ")}}t.exports=e},,,function(t,n){"use strict";function e(){var t=document.querySelector("#page-nav");if(t&&!document.querySelector("#page-nav .extend.prev")&&(t.innerHTML='<a class="extend prev disabled" rel="prev">&laquo; Prev</a>'+t.innerHTML),t&&!document.querySelector("#page-nav .extend.next")&&(t.innerHTML=t.innerHTML+'<a class="extend next disabled" rel="next">Next &raquo;</a>'),yiliaConfig&&yiliaConfig.open_in_new){var n=document.querySelectorAll(".article-entry a:not(.article-more-a)");n.forEach(function(t){t.setAttribute("target","_blank")})}var e=document.querySelector("#js-aboutme");e&&0!==e.length&&(e.innerHTML=e.innerText)}t.exports={init:e}},,,,,,,,,function(t,n){function e(t,n){if("string"==typeof n)return t.insertAdjacentHTML("afterend",n);var e=t.nextSibling;return e?t.parentNode.insertBefore(n,e):t.parentNode.appendChild(n)}t.exports=e}]);
</script>
<script src="/main.68ab53.js"></script>
<script>
(function() {
	var loadScript = function(path) {
	    var $script = document.createElement('script')
	    document.getElementsByTagName('body')[0].appendChild($script)
	    $script.setAttribute('src', path)
	}
	loadScript("/slider.fa3fc2.js")
})();
</script>




<script type="text/x-mathjax-config">
MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
    }
});

MathJax.Hub.Queue(function() {
    var all = MathJax.Hub.getAllJax(), i;
    for(i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';                 
    }       
});
</script>

<script src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>


    
<div class="tools-col" q-class="show:isShow,hide:isShow|isFalse" q-on="click:stop(e)">
  <div class="tools-nav header-menu">
    
    
      
      
      
    
      
    
      
      
      
    
    

    <ul style="width: 70%">
    
    
      
      <li style="width: 50%" q-on="click: openSlider(e, 'innerArchive')"><a href="javascript:void(0)" q-class="active:innerArchive">所有文章</a></li>
      
        
      
        
      
      <li style="width: 50%" q-on="click: openSlider(e, 'aboutme')"><a href="javascript:void(0)" q-class="active:aboutme">关于我</a></li>
      
        
    </ul>
  </div>
  <div class="tools-wrap">
    
    	<section class="tools-section tools-section-all" q-show="innerArchive">
        <div class="search-wrap">
          <input class="search-ipt" q-model="search" type="text" placeholder="find something…">
          <i class="icon-search icon" q-show="search|isEmptyStr"></i>
          <i class="icon-close icon" q-show="search|isNotEmptyStr" q-on="click:clearChose(e)"></i>
        </div>
        <div class="widget tagcloud search-tag">
          <p class="search-tag-wording">tag:</p>
          <label class="search-switch">
            <input type="checkbox" q-on="click:toggleTag(e)" q-attr="checked:showTags">
          </label>
          <ul class="article-tag-list" q-show="showTags">
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">机器人软件构造</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">机器人</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">部署</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">git</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">其他</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">建站</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color2">Ubuntu</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">机器人软件设计</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">论文</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">ROS</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">编译</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">调试</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">机器人系统开发</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">编辑器</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">组件</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color5">ompl</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color5">深度学习</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color1">caffe</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">卷首语</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">整机</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color2">库</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color5">建模文档</a>
              </li>
            
            <div class="clearfix"></div>
          </ul>
        </div>
        <ul class="search-ul">
          <p q-show="jsonFail" style="padding: 20px; font-size: 12px;">
            缺失模块。<br/>1、在博客根目录（注意不是yilia根目录）执行以下命令：<br/> npm i hexo-generator-json-content --save<br/><br/>
            2、在根目录_config.yml里添加配置：
<pre style="font-size: 12px;" q-show="jsonFail">
  jsonContent:
    meta: false
    pages: false
    posts:
      title: true
      date: true
      path: true
      text: true
      raw: false
      content: false
      slug: false
      updated: false
      comments: false
      link: false
      permalink: false
      excerpt: false
      categories: false
      tags: true
</pre>
          </p>
          <li class="search-li" q-repeat="items" q-show="isShow">
            <a q-attr="href:path|urlformat" class="search-title"><i class="icon-quo-left icon"></i><span q-text="title"></span></a>
            <p class="search-time">
              <i class="icon-calendar icon"></i>
              <span q-text="date|dateformat"></span>
            </p>
            <p class="search-tag">
              <i class="icon-price-tags icon"></i>
              <span q-repeat="tags" q-on="click:choseTag(e, name)" q-text="name|tagformat"></span>
            </p>
          </li>
        </ul>
    	</section>
    

    

    
    	<section class="tools-section tools-section-me" q-show="aboutme">
  	  	
  	  		<div class="aboutme-wrap" id="js-aboutme">本科学机械，硕士程序员，读书在中南，工作在中兴。</div>
  	  	
    	</section>
    
  </div>
  
</div>
    <!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                      <div class="pswp__preloader__cut">
                        <div class="pswp__preloader__donut"></div>
                      </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div> 
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>
  </div>
</body>
</html>